package com.jh.user.util;

public class Page {
    //当前页码
    int pageNo;      //传过来
    //每页数据条数
    int pageSize;    //传过来
    //总数据条数
    int total;       //传出来
    //总页数
    int pageCount;   //算过来
    //最多页码数
    int showPageNos;  //传出来
    //起始页码
    int start;     //算出来
    //结束页码
    int end;       //算出来

    /**
     * 分页类
     * @param pageNo  当前页码
     * @param total   总数据条数
     * @param pageSize  每页数据条数
     * @param showPageNos  最多显示的页码数
     */
    public Page(int pageNo, int total, int pageSize, int showPageNos) {
        this.pageNo = pageNo;
        this.total = total;
        this.pageSize = pageSize;
        this.showPageNos = showPageNos;
        valid();
        calc();
    }

    /**
     * 分页类
     * @param pageNo 当前页码
     * @param total  总数据条数
     */
    public Page(int pageNo, int total) {
        //在构造方法中通过this（）调用其他构造方法
        this(pageNo,total,5,3);
    }



    /**
     * 实现计算的方法
     */
    private void calc() {

        pageCount=total%pageSize==0 ? total/pageSize : total/pageSize+1;

        //检查pageNo
        if(pageNo>pageCount) pageNo = pageCount;

        //计算start、end
        start = end =pageNo;
        while (end-start+1 < showPageNos && (start >1 || end <pageCount) ) {
            if (start>1) start--;
            if(end <pageCount) end++;
        }

    }



    @Override
    public String toString() {
        return "Pager [pageNo=" + pageNo + ", pageSize=" + pageSize + ", total=" + total + ", pageCount=" + pageCount
                + ", showPageNos=" + showPageNos + ", start=" + start + ", end=" + end + "]";
    }


    private void valid() {
        if(pageNo<1) throw new PagerException("pageNo",1);
        if(pageSize<1) throw new PagerException("pageSize",1);
        if(total<0) throw new PagerException("total",1);
        if(showPageNos<1) throw new PagerException("showPageNos",1);

        if(total ==0)System.err.println("警告：数据总条数为0！");

    }

    public class PagerException extends RuntimeException{

        private static final long serialVersionUID = 1L;

        public PagerException(String property,int minValue) {
            super(String.format("分页参数%S不能小于%d。", property,minValue));
        }
    }

    /**
     * 获取当前页码
     * @return  当前页码
     */
    public int getPageNo() {
        return pageNo;
    }

    /**
     * 获取每页数据条数
     * @return 每页数据条数
     */
    public int getPageSize() {
        return pageSize;
    }

    /**
     * 获取数据总条数
     * @return  数据总条数
     */
    public int getTotal() {
        return total;
    }

    /**
     * 获取数据总页数
     * @return  数据总页数
     */
    public int getPageCount() {
        return pageCount;
    }

    /**
     * 获取最多显示页码数
     * @return  最多显示页码数
     */
    public int getShowPageNos() {
        return showPageNos;
    }

    /**
     * 获取起始页码
     * @return 起始页码
     */
    public int getStart() {
        return start;
    }

    /**
     * 获取结束页码
     * @return 结束页码
     */
    public int getEnd() {
        return end;
    }

}
